package chapt01;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class MyFirstFrame implements ActionListener {
        JSplitPane tabs;
        JTextField surname, name, age;
        JButton jbtnOk, jbtnCancel, jbtnChange, jbtnSave;
        JLabel jlab,jlab1,jlab2,jlab3,jlab4,jlab5,jlab6;
        JPanel jpn1,jpn2,jpn1_1,jpn1_2,jpn1_1_1,jpn1_2_1,jpn1_2_2;
        JScrollPane Jscrlp;
        JList jlst;
        MyInterface mtf1;
        String list1[], el2[]; 
        ArrayList<Number> list;
        String el, elem, num;
        int ind;

        MyFirstFrame(MyInterface MyInterf){
        	mtf1 = MyInterf;
            list = mtf1.ReadFromFile();
            //создание контейнера верхнего уровня
            JFrame jfrm = new JFrame("My First Frame");     
            //разделение рабочей области
            tabs = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
            tabs.setDividerSize(5);
            jfrm.setLayout(new FlowLayout());
            jfrm.setSize(450,315);
            jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
            //создание панели jpn1, которая находится в левой части
            jpn1 = new JPanel();
            jpn1.setLayout(new GridLayout(2,1,5,10));
            jpn1.setPreferredSize(new Dimension(220,255));
            jpn1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                
            //создание панели jpn1_1, которая будет внутри jpn1
            jpn1_1 = new JPanel();
            jpn1_1.setPreferredSize(new Dimension(210,120));
            jpn1_1.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                
            //внутри jpn1_1
            jpn1_1_1 = new JPanel();
            jpn1_1_1.setLayout(new GridLayout(4,2,10,3));
            jpn1_1_1.setPreferredSize(new Dimension(210,115));
                                
             //внутри jpn1
            jpn1_2 = new JPanel();
            jpn1_2.setPreferredSize(new Dimension(210,115));
            jpn1_2.setLayout(new BorderLayout());
            jpn1_2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                
            //внутри jpn1_2
            jpn1_2_1 = new JPanel();
            jpn1_2_1.setPreferredSize(new Dimension(100,40));
                
            //внутри jpn1_2
            jpn1_2_2 = new JPanel();
            jpn1_2_2.setPreferredSize(new Dimension(100,40));

            //создание панели jpn2, который находится в правой части                
            jpn2 = new JPanel();
            jpn2.setMinimumSize(new Dimension(220,255));
            jfrm.setLayout(new BorderLayout());
            jpn2.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                
            //создание разных деталек
            surname = new JTextField(15);
            name = new JTextField(15);
            age = new JTextField(15);
            jlab = new JLabel("");
            jlab4 = new JLabel("Введите данные");
            jlab5 = new JLabel("");
            jlab6 = new JLabel("Информация об операции");
            jlab1 = new JLabel("Имя");
            jlab2 = new JLabel("Фамилия");
            jlab3 = new JLabel("Возраст");
            jbtnOk = new JButton("Ok");
            jbtnCancel = new JButton("Cancel");
            jbtnChange = new JButton("Change");
            jbtnSave = new JButton("Save");
            jlst = new JList(new MyListModel<Number>(list));
            jbtnSave.setEnabled(false);
            jbtnChange.setEnabled(false);
            
            //установка предпочтительных размеров кнопок
            jbtnOk.setPreferredSize(new Dimension(90,27));
            jbtnCancel.setPreferredSize(new Dimension(90,27));
            jbtnChange.setPreferredSize(new Dimension(90,27));
            jbtnSave.setPreferredSize(new Dimension(90,27));
                
             //связывание кнопок
            jbtnOk.addActionListener(this);
            jbtnCancel.addActionListener(this);
            jbtnChange.addActionListener(this);
            jbtnSave.addActionListener(this);
                
             //создание панели с полосой прокрутки
            Jscrlp = new JScrollPane(jlst);
            Jscrlp.setPreferredSize(new Dimension(185,220));
            Jscrlp.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                
             //добавление элементов в различные панели итд           
             jpn1.add(jpn1_1);
             jpn1.add(jpn1_2);
             jpn1_2.add(jpn1_2_1, BorderLayout.CENTER);
             jpn1_2.add(jpn1_2_2, BorderLayout.SOUTH);
             jpn1_1.add(jpn1_1_1);
             jpn1_1_1.add(jlab4); jpn1_1_1.add(jlab5);
             jpn1_1_1.add(surname);jpn1_1_1.add(jlab2);
             jpn1_1_1.add(name);jpn1_1_1.add(jlab1);
             jpn1_1_1.add(age);jpn1_1_1.add(jlab3);
             jpn1_2_1.add(jlab6);
             jpn1_2_1.add(jlab);
             jpn1_2_2.add(jbtnOk);
             jpn1_2_2.add(jbtnCancel);
             tabs.add(jpn1);
             tabs.add(jpn2);
             jpn2.add(Jscrlp);
             jpn2.add(jbtnChange);
             jpn2.add(jbtnSave);
             jfrm.add(tabs);
             
             jlst.addListSelectionListener(
            		 new ListSelectionListener() {
            			 public void valueChanged(ListSelectionEvent le) {
            				 int idx = jlst.getSelectedIndex();
            				 if (idx != -1){
            					 jbtnChange.setEnabled(true);
            					 jlab.setText("Выбран элемент  " + list.get(idx));}
            				 else jlab.setText("Выбeрите элемент из списка");
            			 }
            		 });

             jbtnOk.addActionListener(new ActionListener() {
            	 public void actionPerformed(ActionEvent ae) {
            		 if((surname.getText().equals("")) || (name.getText().equals("")) || (age.getText().equals(""))){
            			 JOptionPane.showMessageDialog(tabs, "Одно или несколько полей не заполнены");
            		 }
            		 else {
            			 try { 
            				 Integer.valueOf(age.getText());
            				 jlab.setText("Данные сохранены");
            				 
            				 mtf1.AddToList(surname.getText(), name.getText(), age.getText());
            				 surname.setText("");name.setText("");age.setText("");
            				 list = mtf1.ReadFromFile();
            				 jlst.setModel(new MyListModel<Number>(list));
            				 jbtnSave.setEnabled(false);
            				 jbtnChange.setEnabled(false);

            			 } 
            			 catch (NumberFormatException e) { 
            				 JOptionPane.showMessageDialog(tabs, "Неправильный формат данных");
            			 } 
            		 }
            	 }
             });
             
             jbtnCancel.addActionListener(new ActionListener() {
            	 public void actionPerformed(ActionEvent ae) {
            		 jlab.setText("Произведена отмена");             
            		 surname.setText("");name.setText("");age.setText("");
            		 jbtnSave.setEnabled(false);
            		 jbtnOk.setEnabled(true);
            		 jbtnChange.setEnabled(false);
            		 jlst.clearSelection();
            	 }
             });
             
             jbtnChange.addActionListener(new ActionListener() {
            	 public void actionPerformed(ActionEvent ae){
            		 int idx = jlst.getSelectedIndex();      
            		 if (idx != -1){
            			 ind = idx;      
            			 Object index = jlst.getSelectedValue();
            			 el = index.toString();
            			 el2 = mtf1.GetSelected(idx, el);
            			 surname.setText(el2[0]);
            			 name.setText(el2[1]);
            			 age.setText(el2[2]);
            			  
            			 jbtnSave.setEnabled(true);
            			 jbtnOk.setEnabled(false);
            		 }
            		 else jlab.setText("Не выбран элемент");
            	 }
             });
                
             jbtnSave.addActionListener(new ActionListener() {
            	 public void actionPerformed(ActionEvent ae){
            		 if((surname.getText().equals("")) || (name.getText().equals("")) || (age.getText().equals(""))){
            			 JOptionPane.showMessageDialog(tabs, "Одно или несколько полей не заполнены");
            		 }
            		 else {
            			 try { 
            				 Integer.valueOf(age.getText());
            				 el = (surname.getText()+" "+ name.getText()+" " +age.getText());
            				 list = mtf1.EditFromList(ind, el);
            				 mtf1.EditToFile(list);
            				 list = mtf1.ReadFromFile();
            				 jlst.setModel(new MyListModel<Number>(list));
            				 surname.setText("");name.setText("");age.setText("");
            				 jbtnSave.setEnabled(false);
            				 jbtnOk.setEnabled(true);
            				 jbtnChange.setEnabled(false);

            			 } 
            			 catch (NumberFormatException e) { 
            				 JOptionPane.showMessageDialog(tabs, "Неправильный формат данных");
            			 } 
            		 }
            	 }
             });
             //Отображение фрейма
             jfrm.setVisible(true);
        }
        public void actionPerformed(ActionEvent ae){
        }
}